#
#= タスクモデル
#
#
#
class DatTask < ActiveRecord::Base

  #########################
  # 関連定義
  #########################
  # プロジェクト構成データに所有される(1:1)
  belongs_to :dat_projectcomp, :foreign_key => "project_tree_id"
  # タスクコメントデータを所有する(1:多)
  has_many :dat_taskcmts, :foreign_key => "task_id", :dependent=>:destroy
  # タスクユーザーデータを所有する(1:多)
  has_many :dat_taskusers, :foreign_key => "task_id", :dependent=>:destroy
  # タスクファイルデータを所有する(1:多)
  has_many :dat_taskfiles, :foreign_key => "task_id", :dependent=>:destroy
  # タスク履歴データを所有する(1:多)
  has_many :dat_taskhistories  , :foreign_key => "task_id", :dependent=>:destroy

  # 依頼者　プロジェクトユーザーマスタに所有される(1:多)
  belongs_to :dat_user_client, :class_name=>"DatProjectuser", :foreign_key=>"client_user_id"
  # 主担当者　プロジェクトマスタに所有される(1:多)
  belongs_to :dat_user_main, :class_name=>"DatProjectuser", :foreign_key=>"main_user_id"

  #########################
  # フィルタ定義
  #########################
  before_create :create_taskcd

  #########################
  # 検証機能定義
  # （全てのインスタンスで共通の検査項目は、クラスメソッドで定義）
  # （:messageの指定は、言語DBのエラーメッセージ区分に登録されているmsg_cdを指定）
  #########################
  # 未入力検証
  validates_presence_of :plan_power, :message=>:cant_be_empty, :if=>proc{|row| row.last_operation_kbn == 2 || row.last_operation_kbn == 3 }
  validates_presence_of :start_date, :message=>:cant_be_empty, :if=>proc{|row| row.last_operation_kbn == 2 || row.last_operation_kbn == 3 }
  validates_presence_of :end_date, :message=>:cant_be_empty, :if=>proc{|row| row.last_operation_kbn == 2 || row.last_operation_kbn == 3 }
  validates_presence_of :complete_date, :message=>:cant_be_empty, :if=>proc{|row| row.last_operation_kbn == 2 || row.last_operation_kbn == 3 }
  validates_presence_of :main_user_id, :message=>:cant_be_empty, :if=>proc{|row| row.last_operation_kbn == 2 || row.last_operation_kbn == 3 }
  validates_presence_of :result, :message=>:cant_be_empty, :if=>proc{|row| row.last_operation_kbn == 2 || row.last_operation_kbn == 3 }
  # 範囲内検証
  validates_inclusion_of :priority_kbn, :in=>[1,2,3], :message=>:in_not_included
  validates_inclusion_of :tani_kbn, :in=>[1,2,3], :allow_nil=>true, :message=>:in_not_included
  validates_inclusion_of :progress_kbn, :in=>[0,1,2,3,9], :allow_nil=>true, :message=>:in_not_included
  validates_inclusion_of :progress_rate, :in=>0..10, :allow_nil=>true, :message=>:in_not_included
  # 数値チェック
  validates_numericality_of :plan_power, :allow_nil=>true, :message=>:not_numeric
  validates_numericality_of :fcas_power, :allow_nil=>true, :message=>:not_numeric
  validates_numericality_of :exp_power, :allow_nil=>true, :message=>:not_numeric
  # 文字数検証
  validates_length_of :task_cd, :maximum=>255, :allow_nil=>true, :too_long=>"too_long,%d"


  #
  #=== テンプレートデータから属性値をコピーする
  #
  #指定されたテンプレートデータ(TPタスクマスタ）から
  #属性値をコピーする。
  #
  def copyFromTemplate(template)
    self.attributes.each_pair do | key, value |
      case key.to_s
      when "create_user_id"
      when "created_on"
      when "update_user_id"
      when "updated_on"
      else
        if ! template[key.to_s].nil?
          self[key.to_s] = template[key.to_s]
        end
      end
    end
  end


  #
  #=== タスクコードを生成する
  #
  #
  def create_taskcd
    project_id = self.dat_projectcomp.project_id
    if ! project_id.nil?
      count = DatProjectcomp.count( :conditions=>[" project_id=? AND task_kbn=1 ",project_id] )
      task_cd = sprintf("T%03d", count)
      write_attribute("task_cd", task_cd)
    end
  end


  #
  #=== 更新後処理
  #
  #最終操作区分と進捗区分に応じてプロジェクトのログを生成する。
  #
  def after_update
    if self.last_operation_kbn == 4
      projectlog = self.dat_projectcomp.dat_projectlogs.build
      if self.progress_kbn == 3
        projectlog.log_kbn = 5
      else
        projectlog.log_kbn = 4
      end
      projectlog.create_user_id = self.create_user_id
      projectlog.save
    end
  end
end
